{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.font_manager import FontProperties\n",
    "font = FontProperties(fname=r\"c:\\windows\\fonts\\msyh.ttc\", size=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1dc0b6a2240>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def generateplt():\n",
    "    plt.figure()\n",
    "    plt.title('高铁价格与里程数据',fontproperties=font)\n",
    "    plt.xlabel('里程（公里）',fontproperties=font)\n",
    "    plt.ylabel('价格（人民币元）',fontproperties=font)\n",
    "    plt.axis([0, 1000, 0, 500])\n",
    "    plt.grid(True)\n",
    "    return plt\n",
    "\n",
    "plt = generateplt()\n",
    "X = [[60], [140], [210], [380], [860]]\n",
    "y = [[42], [72], [96], [186], [360]]\n",
    "plt.plot(X, y, 'k.')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图中，'x'轴表示行驶里程（公里），'y'轴表示高铁票价（人民币元）。能够看出，高铁票价与行驶里程正相关，这与我们的日常经验也比较吻合，票价自然是越远越贵。下面我们就用scikit-learn来构建模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "预测一张600公里里程的高铁票的价格：￥260\n",
      "预测一张600公里里程的高铁票的价格：￥308\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\lymanZHANG\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.\n",
      "  DeprecationWarning)\n",
      "C:\\Users\\lymanZHANG\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "# 创建并拟合模型\n",
    "model = LinearRegression()\n",
    "model.fit(X, y)\n",
    "print('预测一张600公里里程的高铁票的价格：￥%.0f' % model.predict([600])[0])\n",
    "print('预测一张600公里里程的高铁票的价格：￥%.0f' % model.predict([720])[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一元线性回归假设解释变量和响应变量之间存在线性关系；这个线性模型所构成的空间是一个超平面（hyperplane）。超平面是n维欧氏空间中余维度等于一的线性子空间，如平面中的直线、空间中的平面等，总比包含它的空间少一维。在一元线性回归中，一个维度是响应变量，另一个维度是解释变量，总共两维。因此，其超平面只有一维，就是一条线。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上述代码中sklearn.linear_model.LinearRegression类是一个估计器（estimator）。\n",
    "\n",
    "估计器依据观测值来预测结果。在scikit-learn里面，所有的估计器都带有fit()和predict()方法。\n",
    "\n",
    "fit()用来分析模型参数，predict()是通过fit()算出的模型参数构成的模型，对解释变量进行预测获得的值。\n",
    "\n",
    "因为所有的估计器都有这两种方法，所有scikit-learn很容易实验不同的模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "LinearRegression类的fit()方法学习下面的一元线性回归模型：\n",
    "y = a + bx\n",
    "\n",
    "y表示响应变量的预测值，本例指高铁票价格预测值，是解释变量，本例指高铁行驶里程。截距和相关系数是线性回归模型最关心的事情。下图中的直线就高铁行驶里程与票价的线性关系。用这个模型，你可以计算不同里程的高铁票的价格，600公里票价为￥260元，720公里的票价为￥308元。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nr53zhGaWTDDnEmXKlDnzuOOOi1XshUpWVhbFimnOT1BdRFJd7Ke62G/JkiWb3L16tM6XXwnlAndf\nY2Y1gE/MbFHkxnBY52HdewuT0lCAxo0b++LFi6MXbSGWlpZGUlJSvMMoEFQX+6ku9lNd7BcO1Iia\nfEnT7r4mfN0AvE1wC2u9mWWPv68FbAh3X8Nvx/LXCctERKQAi3lCMbPyZlYxexm4DPgWmAh0Cnfr\nBLwbLk8EOphZaTOrTzAkc06s4xQRkd8nP2551QTeDsfMlwDGuPuHZvY5MN7M7gJ+BNoDuPsCMxtP\nMDNq9oNXGuElIlLAxTyhuPtygiktcpb/TPAdEwc6ph/BlxeJiEghoaEOIiISFUooIiISFUooIiIS\nFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUoo\nIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiIS\nFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiISFUooIiIJZsWWFdz+zu1RP2+JqJ9R\nREQKpLU71tJvej+GzhtKMYt+e0ItFBGRIu7nXT/T+ZPONBzYkBfnvchdze5i2QPLon4dtVBERIqo\nHRk7eHbWszw982l2ZOzg1tNupefFPWlYpWFMrqeEIiJSxPyy9xeGfD6E/p/2Z9OuTVx/4vX0bdmX\nk2ucHNPrKqGIiBQRe/ft5eUvX6bPtD78tOMnLmt4GaktUzm79tn5cn0lFBGRQm5f1j5e//Z1eqb1\nZPmW5bSo24LXbniNpHpJ+RpHvnXKm1lxM/vSzN4L16uY2Sdm9n34enTEvl3MbKmZLTazNvkVo4hI\nYeLuvLPoHU5/4XRue/s2KpWuxP/d8n/MuGNGvicTyN9RXg8C30WsPwpMcvdGwKRwHTNrAnQATgYu\nB4aYWfF8jFNEpEBzdz5Z9gnnDD+H68ddT2ZWJuNuHMe85Hlc2ehKzCwuceVLQjGzOsBVwPCI4rbA\nyHB5JHBdRPlYd89w9xXAUqB5fsQpIlLQfbbqMy4ZdQmXjb6M9TvX8/K1L/Ptvd/S/uT2MXm25HDk\nVx/KAOCfQMWIspruvjZcXgfUDJdrA7Mi9lsdlv2GmSUDyQDVq1cnLS0tyiEXTunp6aqLkOpiP9XF\n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\nEYmK/w+xG+D8gyfHLwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1dc0dfdf048>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt = generateplt()\n",
    "plt.plot(X, y, 'k.')\n",
    "X2 = [[0], [180], [360], [600], [720], [850], [1000]]\n",
    "model = LinearRegression()\n",
    "model.fit(X, y)\n",
    "y2 = model.predict(X2)\n",
    "plt.plot(X, y, 'k.')\n",
    "plt.plot(X2, y2, 'g-')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一元线性回归拟合模型的参数估计常用方法是普通最小二乘法（ordinary least squares ）或线性最小二乘法（linear least squares）。首先，我们定义出拟合代价函数，然后对参数进行数理统计。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 带代价函数的模型拟合评估\n",
    "\n",
    "下图是由若干参数生成的回归直线。如何判断哪一条直线才是最佳拟合呢？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1dc0cf9cb70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt = generateplt()\n",
    "plt.plot(X, y, 'k.')\n",
    "y3 = [280, 280, 280, 280, 280, 280, 280]\n",
    "y4 = y2 * 0.5 + 5\n",
    "model.fit(X[1:-1], y[1:-1])\n",
    "y5 = model.predict(X2)\n",
    "plt.plot(X, y, 'k.')\n",
    "plt.plot(X2, y2, 'g-.')\n",
    "plt.plot(X2, y3, 'r-.')\n",
    "plt.plot(X2, y4, 'y-.')\n",
    "plt.plot(X2, y5, 'o-')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "代价函数（cost function）也叫损失函数（loss function），用来定义模型与观测值的误差。模型预测的价格与训练集数据的差异称为残差（residuals）或训练误差（training errors）。后面我们会用模型计算测试集，那时模型预测的价格与测试集数据的差异称为预测误差（prediction errors）或训练误差（test errors）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "模型的残差是训练样本点与线性回归模型的纵向距离，如下图所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1dc0e2ce470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt = generateplt()\n",
    "plt.plot(X, y, 'k.')\n",
    "X2 = [[60], [140], [210], [380], [860]]\n",
    "model = LinearRegression()\n",
    "model.fit(X, y)\n",
    "y2 = model.predict(X2)\n",
    "plt.plot(X, y, 'k.')\n",
    "plt.plot(X2, y2, 'g-')\n",
    "# 残差预测值\n",
    "yr = model.predict(X)\n",
    "for idx, x in enumerate(X):\n",
    "    plt.plot([x, x], [y[idx], yr[idx]], 'r-')\n",
    "    \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以通过残差之和最小化实现最佳拟合，也就是说模型预测的值与训练集的数据最接近就是最佳拟合。对模型的拟合度进行评估的函数称为残差平方和（residual sum of squares）代价函数。就是让所有训练数据与模型的残差的平方之和最小化，如下所示：\n",
    "\n",
    "![costFunctionFomula](https://github.com/lymanzhang/Machine-Learning-for-Design/blob/master/Session02_SupervisiedLearning/img_LinearRegression/ml4d_costFunctionForumula.JPG)\n",
    "\n",
    "其中，y<sub>i</sub>是观测值，f(x<sub>i</sub>)是预测值。\n",
    "\n",
    "残差平方和计算如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "残差平方和: 58.21\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "print('残差平方和: %.2f' % np.mean((model.predict(X) - y) ** 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "有了代价函数，就要使其最小化获得参数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 解一元线性回归的最小二乘法\n",
    "\n",
    "通过成本函数最小化获得参数，我们先求相关系数b。按照频率论的观点，我们首先需要计算x的方差和x与y的协方差。\n",
    "方差是用来衡量样本分散程度的。如果样本全部相等，那么方差为0。方差越小，表示样本越集中，反正则样本越分散。方差计算公式如下：\n",
    "\n",
    "![]()\n",
    "\n",
    "其中， xbar是直径的均值， x<sub>i</sub>的训练集的第i个里程样本， n是样本数量。计算如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "101700.0\n"
     ]
    }
   ],
   "source": [
    "# 如果是Python2，加from __future__ import division\n",
    "xbar = (60 + 140 + 210 + 380 + 860) / 5\n",
    "variance = ((60 - xbar)**2 + (140 - xbar)**2 + (210 - xbar)**2 + (380 - xbar)**2 + (860 - xbar)**2) / 4\n",
    "print(variance)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Numpy里面有var方法可以直接计算方差，ddof参数是贝塞尔(无偏估计)校正系数（Bessel's correction），设置为1，可得样本方差无偏估计量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "101700.0\n"
     ]
    }
   ],
   "source": [
    "print(np.var([60, 140, 210, 380, 860], ddof=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "协方差表示两个变量的总体的变化趋势。如果两个变量的变化趋势一致，也就是说如果其中一个大于自身的期望值，另外一个也大于自身的期望值，那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反，即其中一个大于自身的期望值，另外一个却小于自身的期望值，那么两个变量之间的协方差就是负值。如果两个变量不相关，则协方差为0，变量线性无关不表示一定没有其他相关性。协方差公式如下：\n",
    "\n",
    "![]()\n",
    "\n",
    "其中，xbar是直径的均值，x<sub>i</sub>的训练集的第i个里程样本，ybar是价格的均值，y<sub>i</sub>的训练集的第i个票价样本，n是样本数量。计算如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "40890.0\n"
     ]
    }
   ],
   "source": [
    "ybar = (42 + 72 + 96 + 186 + 360) / 5\n",
    "cov = ((60 - xbar) * (42 - ybar) + (140 - xbar) * (72 - ybar) + (210 - xbar) *(96 - ybar) + (380 - xbar)* (186 - ybar) + (860 - xbar) * (360 - ybar)) / 4\n",
    "print(cov)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Numpy里面有cov方法可以直接计算方差。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "40890.0\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "# X = [[60], [140], [210], [380], [860]]\n",
    "# y = [[42], [72], [96], [186], [360]]\n",
    "print(np.cov([60, 140, 210, 380, 860], [42, 72, 96, 186, 360])[0][1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在有了方差和协方差，就可以计算相关系数了。\n",
    "\n",
    "b = cov(x,y) / var(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.4020648967551622\n"
     ]
    }
   ],
   "source": [
    "b = cov / variance\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "算出b后，我们就可以计算a了：\n",
    "a = ybar - b*xbar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "18.518584070796464\n"
     ]
    }
   ],
   "source": [
    "a = ybar - b * xbar\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这样就通过最小化代价函数求出模型参数了。\n",
    "\n",
    "把行驶里程带入方程就可以求出对应的高铁票价了，如180公里高铁票的价格￥91，320公里高铁票的价格￥147。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "一张180公里里程的高铁票的价格：￥91\n",
      "一张320公里里程的高铁票的价格：￥147\n"
     ]
    }
   ],
   "source": [
    "price1 = a + b * 180\n",
    "price2 = a + b * 320\n",
    "print('一张180公里里程的高铁票的价格：￥%.0f' % price1)\n",
    "print('一张320公里里程的高铁票的价格：￥%.0f' % price2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型评估\n",
    "\n",
    "前面我们用学习算法对训练集进行估计，得出了模型的参数。如何评价模型在现实中的表现呢？现在让我们假设有另一组数据，作为测试集进行评估。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|训练样本|行驶里程（公里）| 高铁票价（人民币元）|预测票价（人民币元）|\n",
    "|--|--|--|--|\n",
    "|1|88|40|54|\n",
    "|2|256|116|121|\n",
    "|3|384|175|173|\n",
    "|4|678|306|291|\n",
    "|5|950|428|400|"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "有些度量方法可以用来评估预测效果，我们用R<sup>2</sup>（r-squared）评估高铁票价格预测的效果。R<sup>2</sup>也叫确定系数（coefficient of determination），表示模型对现实数据拟合的程度。计算R<sup>2</sup>的方法有几种。一元线性回归中R^2等于皮尔逊积矩相关系数（Pearson product moment correlation coefficient或Pearson's r）的平方。\n",
    "\n",
    "这种方法计算的R<sup>2</sup>一定介于0～1之间的正数。其他计算方法，包括scikit-learn中的方法，不是用皮尔逊积矩相关系数的平方计算的，因此当模型拟合效果很差的时候R<sup>2</sup>会是负值。下面我们用scikitlearn方法来计算R<sup>2</sup>。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先，我们需要计算样本总体平方和， ybar是价格的均值，y<sub>i</sub> 的训练集的第i个价格样本， n是样本数量。\n",
    "\n",
    "![SStot](https://github.com/lymanzhang/Machine-Learning-for-Design/blob/master/Session02_SupervisiedLearning/img_LinearRegression/ml4d_SStotFomula.JPG)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "95656.0\n"
     ]
    }
   ],
   "source": [
    "mean = (40 + 116 + 175 + 306 + 428) / 5\n",
    "SStot = (40 - mean)*(40 - mean) + (116 - mean)*(116 - mean) + (175 - mean)*(175 - mean) + (306 - mean)*(306 - mean) + (428 - mean)*(428 - mean)\n",
    "print(SStot)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "然后，我们计算残差平方和，和前面的一样：\n",
    "\n",
    "![SSres](https://github.com/lymanzhang/Machine-Learning-for-Design/blob/master/Session02_SupervisiedLearning/img_LinearRegression/ml4d_SSresFomula.JPG)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5770\n"
     ]
    }
   ],
   "source": [
    "SSres = (40-54)*(40-54) + (116-121)*(116-121) + (175-173)*(175-173) + (360-291)*(360-291) + (428-400)*(428-400)\n",
    "print(SSres)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后用下面的公式计算R<sup>2</sup>：\n",
    "\n",
    "![R2](https://github.com/lymanzhang/Machine-Learning-for-Design/blob/master/Session02_SupervisiedLearning/img_LinearRegression/ml4d_R2Fomula.JPG)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9396796855398512\n"
     ]
    }
   ],
   "source": [
    "R2 = 1- SSres / SStot\n",
    "print(R2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "R<sup>2</sup>是0.987说明测试集里面几乎在所有的价格都可以通过模型解释。现在，让我们用scikit-learn来验证\n",
    "一下。LinearRegression的score方法可以计算R<sup>2</sup>："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  53.90029499]\n",
      " [ 121.44719764]\n",
      " [ 172.91150442]\n",
      " [ 291.11858407]\n",
      " [ 400.48023599]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.98739184235282362"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 测试集\n",
    "X_test = [[88], [256], [384], [678], [950]]\n",
    "y_test = [[40], [116], [175], [306], [428]]\n",
    "model = LinearRegression()\n",
    "model.fit(X, y)\n",
    "thisY = model.predict(X_test)\n",
    "print(thisY)\n",
    "model.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
